package XML与JSON.使用DOM;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
//import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

public class DOM使用TreeWalker {

	public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
		File file = new File("src\\main\\java\\XML与JSON\\使用DOM\\users1.xml");
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder loader = factory.newDocumentBuilder();
		Document document = loader.parse(file);
		document.normalize();//把节点（包括属性）下的所有文本节点放置到一个"标准"的格式中，其中只有结构（比如元素、注释、处理指令、CDATA 区段以及实
		                     //体引用）来分隔 Text 节点，例如，既没有相邻的 Text 节点，也没有空的 Text 节点。
		DocumentTraversal traversal = (DocumentTraversal) document;

		TreeWalker walker = traversal.createTreeWalker(document.getDocumentElement(),
				NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT|NodeFilter.SHOW_COMMENT, null, true);
		Node Root=walker.getRoot();
		traverseLevel(walker, "",Root);
	}

	private static void traverseLevel(TreeWalker walker, String indent,Node root) {
		//System.out.println(walker.getRoot().getNodeName());
		Node node = walker.getCurrentNode();
		switch (node.getNodeType()) {
			case Node.COMMENT_NODE: // Document节点   #8
				System.out.println(indent+"<!--" + node.getNodeValue()+"-->");
				break;
			case Node.ELEMENT_NODE:
				System.out.print("\n"+indent + "<"+node.getNodeName());//使用缩进来打印元素的名称
				NamedNodeMap attrs=node.getAttributes();
				for (int i=0;i<attrs.getLength();i++) {
					Attr attr=(Attr) attrs.item(i);
					System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
				}
				
				System.out.print(">");
				break;
			case Node.TEXT_NODE:
				String content_trimmed = node.getTextContent().trim();
				if (content_trimmed.length() > 0) {
					//System.out.print(indent);
					//System.out.printf("%s%n", content_trimmed);
					System.out.printf("%s", content_trimmed);
					System.out.print("test");
				}
				break;
			default: // 其他
				System.out.println("NodeType: " + node.getNodeType() + ", NodeName: " + node.getNodeName());
		}
		
		for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) {
			traverseLevel(walker, indent + "   ",root);
		}
//		if (!node.isSameNode(root)) {
//			if ((node.getNodeName()=="#text")&(node.getNextSibling()!=null)) {
//				if (node.getNextSibling().getNodeName()=="#text") {System.out.print(indent + "</"+node.getNodeName()+">");}
//			}
//		} else {
		if (node.getNodeType()==1)	{
//			NodeList list=node.getChildNodes();
//			for (int i=0;i<list.getLength();i++) {
//				traverseLevel(list.item(i),indent+"  ",root);
//			}
			if (node.getNextSibling()!=null) {
				//switch (node.getNextSibling().getNodeType()) {
				switch (node.getChildNodes().item(0).getNodeType()) {
					case Node.ELEMENT_NODE:
						System.out.print("\n"+indent + "</"+node.getNodeName()+">");
						break;
					case Node.TEXT_NODE:
						System.out.print( "</"+node.getNodeName()+">");
						break;
				}
			}else {
				System.out.print("\n"+indent + "</"+node.getNodeName()+">");
			}
		}
		
		walker.setCurrentNode(node);//完成分支处理后，我们将与setCurrentNode()进入同一级别，以便我们可以继续进行另一个树分支。
	}
}

